看到一篇文章在教學購物車,程式裡出現了一種長這樣||=
or-equals的運算符
def current_cart
@current_cart ||= find_cart
end
private
def find_cart
cart = Cart.find_by(id: session[:cart_id])
end
基於好奇心,就來查查看這是什麼碗糕了。先來玩一下
從最簡單的例子來看,得到的結果a = 1
在預料之中。
a ||= 1
puts a # a = 1
第二試
在第一行先將123
給a,第二行換成456
,最後得到的結果還是123
a ||= 123
a ||= 456
puts a # a = 123
那我們將原本的值123換成nil
或是false
呢?
a ||= nil
a ||= 456
puts a # a = 456
-------
a ||= true
a ||= 456
puts a # a = true
-------
a ||= false
a ||= 456
puts a # a = 456
從結果來看,當a = true
時,結果會等於true
則換成nil
或是false
,最後得到結果居然是第二行的456
那我們再換成字串試試,結果依然是第一行的所給予的字串
a ||= "hello"
a ||= 1
puts a # a = hello
這樣有更清楚||=是怎麼運作的嗎?
如果利用最簡單的講法,其實a ||= b
就為a || a = b
然後從以上結果我們可以得到再回到我們current_cart
這一段寫法@current_cart ||= find_cart
其實就等同於
@current_cart || @current_cart = find_cart
經過翻譯之後的結果,大概就長這樣啦!
if @current_cart.nil?
find_cart
else
@current_cart
end